"""此模块用于创建图像查看器，展示指定文件夹中的图像，并支持自动刷新功能。"""
import os
import threading
import time
import tkinter as tk
from PIL import Image, ImageTk, ImageDraw, ImageFont


def load_images_from_folder(folder):
    """从指定文件夹加载图像文件，并按文件前的数字排序."""
    images = []
    for filename in sorted(os.listdir(folder), key=lambda x: float(x[:-4]), reverse=True):
        if filename.endswith(('.png', '.jpg', '.jpeg')):  # 只处理图像文件
            img_path = os.path.join(folder, filename)
            images.append((img_path, filename[:-4]))  # 返回图像路径及文件名（去掉扩展名）
    return images

def create_image_viewer(folder_path):
    """创建图像查看器并展示指定文件夹中的图像, 返回刷新函数."""
    
    def show_images():
        """显示前五张图像于标签中."""
        for i, (image_path, filename) in enumerate(images[:8]):
            img = Image.open(image_path).convert("RGBA")
            img = img.resize((200, 200), Image.Resampling.LANCZOS)  # 调整图像大小，使用 LANCZOS

            # 在图像上添加文本
            draw = ImageDraw.Draw(img)
            font = ImageFont.load_default()  # 使用默认字体
            text_position = (10, 10)  # 文本位置
            try:
                font = ImageFont.truetype("arial.ttf", 30)  # 加载自定义字体并设置大小
            except IOError:
                font = ImageFont.load_default()  # 如果无法加载自定义字体则使用默认字体
            draw.text(text_position, f"{filename} M", fill="red",font=font)  # 添加文本

            img = ImageTk.PhotoImage(img)

            # 计算位置并创建标签显示图像
            image_label = tk.Label(root, image=img)
            image_label.image = img  # type: ignore # 保持对图像的引用
            image_label.grid(row=i//2, column=i%2)  # 放置在一列中，垂直排列

    def refresh_images():
        """刷新图像列表."""
        nonlocal images
        images = load_images_from_folder(folder_path)  # 重新加载图像
        for widget in root.grid_slaves():  # 清除之前的图像标签
            widget.destroy()
        show_images()  # 显示新图像

    def auto_refresh():
        """每五秒自动刷新图像."""
        while True:
            refresh_images()
            time.sleep(10)

    # 创建Tkinter窗口
    root = tk.Tk()
    root.title("Display Faces Images")

    # 加载图像
    images = load_images_from_folder(folder_path)

    # 显示图像
    show_images()

    # 启动自动刷新线程
    refresh_thread = threading.Thread(target=auto_refresh, daemon=True)
    refresh_thread.start()

    # 启动程序
    root.after(0, lambda: root.focus_force())  # 确保窗口获得焦点
    root.mainloop()

# 使用示例：
if not os.path.exists("faces"):
    os.makedirs("faces")
folder_path = "faces"  # 图像文件夹路径
create_image_viewer(folder_path)
